package jm.java.methodArea;

import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;

/**
 * @Description 方法区元空间内存溢出
 * classloader：用来加载类的二进制字节码。
 * @date 2022/3/18 14:30
 */
public class MethodAreaOverflow extends ClassLoader{
    public static void main(String[] args) {
        int j = 0;
        try{
            MethodAreaOverflow methodAreaOverflow = new MethodAreaOverflow();
            for (int i = 0; i < 10000; i++) {
                // 生成类的二进制字节码
                ClassWriter writer = new ClassWriter(0);
                /**
                 * visit：
                 *       1. 版本号
                 *       2. 访问修饰符
                 *       3. 类名称
                 *       4. 包名
                 *       5. 父类
                 *       6. 实现的接口
                 */
                writer.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"Class" + i,
                        null,"java/lang/Object",null);

                // 返回生成类的字节码数组
                byte[] code = writer.toByteArray();

                // 执行类加载
                methodAreaOverflow.defineClass("Class" + i, code, 0,code.length);

                j++;
            }
        }finally {
            System.out.println(j);
        }
    }
}
